#ifndef CONFIG_H
#define CONFIG_H

#include <QObject>
#include <QString>
#include <QVariant>
#include <QMutex>
#include "services/DatabaseService.h"

/**
 * @brief 配置管理工具类（单例模式）
 * @details 从 system_config 表读取/写入配置参数
 *          支持类型：string、int、float、bool
 */
class Config : public QObject
{
    Q_OBJECT

public:
    // 获取单例实例
    static Config *instance();

    // 禁止拷贝构造和赋值
    Config(const Config &) = delete;
    Config &operator=(const Config &) = delete;

    // 初始化配置（连接数据库）
    bool initialize();

    // 读取配置值（泛型方法）
    QString getString(const QString &key, const QString &defaultValue = QString());
    int getInt(const QString &key, int defaultValue = 0);
    double getDouble(const QString &key, double defaultValue = 0.0);
    bool getBool(const QString &key, bool defaultValue = false);

    // 写入配置值
    bool setString(const QString &key, const QString &value);
    bool setInt(const QString &key, int value);
    bool setDouble(const QString &key, double value);
    bool setBool(const QString &key, bool value);

    // 检查配置项是否存在
    bool hasKey(const QString &key);

    // 删除配置项
    bool removeKey(const QString &key);

    // 获取所有配置项（用于调试）
    QMap<QString, QString> getAllConfig();

    // 常用配置项的快捷访问方法（暴露给 QML）
    Q_INVOKABLE int pollInterval() { return getInt("poll_interval", 1000); }
    Q_INVOKABLE double tempWarningThreshold() { return getDouble("temp_warning_threshold", 80.0); }
    Q_INVOKABLE double tempCriticalThreshold() { return getDouble("temp_critical_threshold", 100.0); }
    Q_INVOKABLE double pressureWarningThreshold() { return getDouble("pressure_warning_threshold", 500.0); }
    Q_INVOKABLE double pressureCriticalThreshold() { return getDouble("pressure_critical_threshold", 800.0); }
    Q_INVOKABLE double flowWarningThreshold() { return getDouble("flow_warning_threshold", 100.0); }
    Q_INVOKABLE int realtimeDataRetentionDays() { return getInt("realtime_data_retention_days", 7); }
    Q_INVOKABLE int minuteDataRetentionDays() { return getInt("minute_data_retention_days", 30); }
    Q_INVOKABLE int hourDataRetentionDays() { return getInt("hour_data_retention_days", 365); }
    Q_INVOKABLE bool autoCleanupEnabled() { return getBool("auto_cleanup_enabled", true); }
    Q_INVOKABLE QString cleanupTime() { return getString("cleanup_time", "02:00"); }

signals:
    // 配置变更信号
    void configChanged(const QString &key, const QVariant &value);

private:
    explicit Config(QObject *parent = nullptr);
    ~Config();

    // 通用读取方法
    QVariant getValue(const QString &key, const QVariant &defaultValue);

    // 通用写入方法
    bool setValue(const QString &key, const QVariant &value, const QString &type);

private:
    static Config *s_instance; // 单例实例
    static QMutex s_mutex;     // 互斥锁
    bool m_initialized;        // 是否已初始化
};

#endif // CONFIG_H
